using System;
using System.IO;
using System.Collections;
using System.Xml;
using System.Xml.Serialization;


namespace Servidor
{
	/*
	 * Objeto que representa un mensaje a enviar
	 * este es serializado a XML para ser tratado por el servidor y cliente
	 * El formato es:
	 * 	<?xml version="1.0" encoding="utf-8"?>
	 *		<Mensaje xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  	 *		<contenido>Bienvenido al servidor</contenido>
  	 *		<buffer>QmllbnZlbmlkbyBhbCBzZXJ2aWRvcg==</buffer>
  	 *		<clientID>003c1e79-b5a7-4f1b-8530-a57ff364556b</clientID>
  	 *		<videoID>0</videoID>
	 *  </Mensaje>
	 * Si videoID es distinto de cero el mensaje esta pidiendo un video al servidor
	 */
	 	  
	
	[XmlRoot("Mensaje")]
	public class Mensaje
	{
		
		public enum MsgType{
			MSG,LIST,VIDEO,IMG,ERROR
		}
		[XmlElement("Tipo")]
		public MsgType tipo;
		[XmlElement("contenido")]
		public String contenido;
		[XmlElement("clientID")]
		public Guid clientID;
		
		
		[XmlIgnore]
		private String archivo;
		
		/*
		 * Constructor
		 * genera el nombre de archivo basado en el id del cliente
		 */
		public Mensaje(Guid id){
			archivo=Directory.GetCurrentDirectory()+"/xml/serialize"+id+".xml";			
		}//Mensaje
		
		/*
		 * Constructor generico
		 */
		public Mensaje(){
			archivo=Directory.GetCurrentDirectory()+"/xml/serialize"+DateTime.Now.Millisecond.ToString()+".xml";			
		}//Mensaje
		
		/*
		 * Metodo de Serializado
		 * genera el archivo XML basado en el objeto
		 */
		public void Serialize(){
            
            XmlSerializer xs = new XmlSerializer(typeof(Mensaje));
			FileStream f = new FileStream(archivo,FileMode.Create,FileAccess.Write,FileShare.ReadWrite);
			TextWriter 	  tw = new StreamWriter(f);
			xs.Serialize(tw,this);
			tw.Close();
		}//Serialize
		
		/*
		 * Metodo de Serializado
		 * genera un archivo XML basado en el objeto
		 * identico al anterior pero genera un archivo
		 * llamado recibido+clientID
		 * usado para almacenar la informacion recibida
		 */
		public void RSerialize(){
			XmlSerializer xs = new XmlSerializer(typeof(Mensaje));
			string ar = Directory.GetCurrentDirectory()+"/xml/recibido"+clientID+".xml";			
			FileStream f = new FileStream(ar,FileMode.Create,FileAccess.Write,FileShare.ReadWrite);
			
			TextWriter 	  tw = new StreamWriter(f);
			xs.Serialize(tw,this);
			tw.Close();
		}//RSerialize
		
		/*
		 * Metodo estatico para deserializar un archivo
		 * transformandolo en un objeto Mensaje
		 * @param String archivo a deserializar
		 * @param Guid id del cliente
		 * @return Objeto Mensaje
		 */
		public static Mensaje Deserialize(String file,Guid id){
			Mensaje mensaje = new Mensaje();
			TextReader tr   = new StreamReader(file);
			XmlSerializer xs= new XmlSerializer(typeof(Mensaje));
			mensaje         = (Mensaje)xs.Deserialize(tr);
			tr.Close();
			return mensaje;
		}//Deserialize
		
		/*
		 * Metodo estatico para deserializar un archivo
		 * transformandolo en un objeto Mensaje
		 * @param Stream stream que contiene la informacion a deserializar
		 * @return Objeto Mensaje
		 */
		public static Mensaje Deserialize(Stream stream){
			Mensaje mensaje = new Mensaje();
			StreamReader sr = new StreamReader(stream);
			XmlSerializer xs= new XmlSerializer(typeof(Mensaje));
			mensaje         = (Mensaje)xs.Deserialize(sr);
			sr.Close();
			return mensaje;
		}//Deserialize
		
		/*
		 * Retorna el nombre de archivo
		 */
		public String getFile(){
			return archivo;
		}//getFile
		
	}
}

